


Cartoon Battle

by AnotherRPGEnthusiast



Category: Adventure Time, Gravity Falls, Original Work, Steven Universe (Cartoon), The Amazing World of Gumball
Genre: Comedy, Gen, RPG, Twine, fangame, game
Language: English
Status: Completed
Published: 2019-07-08
Updated: 2020-04-25
Packaged: 2020-06-24 00:50:07
Rating: General Audiences
Warnings: No Archive Warnings Apply
Chapters: 10
Words: 8,346
Publisher: archiveofourown.org
Story URL: https://archiveofourown.org/works/19712947
Author URL: https://archiveofourown.org/users/AnotherRPGEnthusiast/pseuds/AnotherRPGEnthusiast
Summary: A tactical role-playing game pitting you against beloved cartoon characters.Game link.





	1. Chapter 1

This is a lighthearted role-playing game used to test my engine for text-based RPGs, [Another RPG Engine](https://anotherrpgenthusiast.itch.io/another-rpg-engine). There is not much in the way of plot, but every character has an introduction scene, complete with dialogue trees and fun interactions. Please try it out and tell me what you think!

**[The game can be played here.](https://anotherrpgenthusiast.itch.io/cartoon-battle) **

This is my first game, and it is still in testing, so please tell me of any issues you encounter or things you'd like to see!

### Trivia

  * Many aspects of the battle system, including the playable characters and their abilities, were heavily inspired by the game _[Bonfire](https://moacube.com/games/bonfire/)_.
  * The "fite me" gag and the "Exacerbate" ability are references to [Teenage Costume Squad](https://rpgmaker.net/games/5703/), a lovely RPG you should try if you love fast-paced tactical battles.

  * "Indignant Variati" is an homage to [Alter A.I.L.A. Genesis](https://rpgmaker.net/games/272/), the game that served as the inspiration for the energy system.

  * "Off Your High Horse" is an homage to [Soul Sunder](https://rpgmaker.net/games/5751/), a cool survival horror RPG you might enjoy if you like resource management games.

  * "Neutralize", "Walled City", and "Assured Aegis" are homages to [Null Regrets](https://rpgmaker.net/games/6554/), a slightly less cool RPG that I still enjoyed.

  * Archer's Mark ability was taken from Mia's Brand ability in [Prayer of the Faithless](https://rpgmaker.net/games/7969/).

  * Many of the Crystal Gems' abilities are taken directly from _Attack the Light_.

  * Mabel's "Galacta Burning" and "Galacta Blazing" abilities are a reference to _UnderTale_.

  * Dipper's spells are from _Eternal Darkness_.

  * "A Farewell to Arms" is, of course, a pun on the book _A Farewell to Arms_. I haven't actually read it, but the pun is too good to pass up. I doubt I'm the first to make it and I can't take credit for it; I got the idea from the comment section of a particularly gory webcomic that featured a lot of dismemberment.

  * Pearl's "Comet Strike" and Rose's "Starlight Flurry" attacks are references to _Last Scenario_.

  * Rose's "Meteor Strike" attack is a reference to _Radiant Historia_.

  * The description of Walled City, "A shield to repel all," is a quote from the first _Kingdom Hearts._

  * One of the lines in the championship scene is a play on a quote from _The Lord of the Rings_ : "I love not the sword for its sharpness, nor the arrow for its swiftness; I love only that which it defends."

  * One of the final boss' lines is taken from Knight's "last stand" quote in _Bonfire_ : "As long as I'm here, you haven't won!"
  * "Flawless Deduction" is an homage to [The Logomancer](https://store.steampowered.com/app/375430/The_Logomancer/).

  * "Appalling Secret" is an homage to _Fallen London_.





	2. Gumball boss live

### Version 0.60

  * **NEW CONTENT:** Fight the matriarch of the Watterson family, Nicole Watterson! She is a martial artist of unparalleled strength and skill, and will tear your puppets to mince if you can't keep up. To fight her, you'll need to have beaten the Watterson kids first.
  * Updated to engine version 1.02; this includes the damage formula change. Piercing and multihit abilities have had their weights adjusted to hopefully preserve the same balance.
  * Enemy parties have had their HP reduced to 2000 total (from 3000 total). This should make them significantly easier, especially for new players.
  * Achievements are now displayed in a fancy box that changes to gold when they're earned!
  * Made the Hub passage wider for readability.
  * Fixed a typo in "Something in your eye" act text.
  * Bard's Rewrite cost down to 4 (from 5).
  * Fixed a typo in the Mystery Twins scene.
  * Forsaken duration up to 5 (from 4).
  * Darwin's Moralize effect weight down to 0.3 (from 0.6).




	3. Steven Universe boss live

### Version 0.70

**NEW CONTENT!**

Fight Rose Quartz, the leader of the Crystal Gems! Her impenetrable shield will deflect all but the strongest of your attacks, ensuring a long and grueling battle that will test your resources to the limit. To fight her, you will need to have beaten the Crystal Gems already. (Remember that the game autosaves every time you complete a battle, and you can load saves from the sidebar.)


	4. New achievements, several adjustments, & bugfixes

### Version 0.71

  * Updated to engine version 1.04. Once again, this won't be very noticeable to you, but makes things significantly easier for me. The one relevant change is that spread attacks (such as Pearl's Shooting Stars) can now hit untargetable characters.
  * New achievements for those seeking a harder challenge: Try defeating Nicole without debuffs, or defeating Rose without piercing attacks.
  * Rose's shield now protects against damage-over-time effects, as stated.
  * Rose now has tolerance 1 vs. Burning and Poisoned. Remember that Burning tolerance applies to Perdition too!
  * Perdition now deals half damage to bosses.
  * Poison Prick duration down to 3 (from 4).
  * Knocked Down is now sticky and unblockable, which means that it can no longer be cured by magic or panaceas, and will not be blocked by Chi Shield and Stasis. However, it can now be cured even when in Stasis. I could say there were gameplay balance reasons for this, but honestly, I only did it because I was finding it increasingly hard to justify how spiritual protection was supposed to keep you from getting physically knocked over.
  * Annulment now no longer removes Alert and Chi Shield, but inflicts damage in addition to its dispel. This was done to make it meaningfully distinct from Renewal.
  * Mass attacks (flamethrowers and gas bombs -- and now, Annulment!) no longer include guarded enemies in their damage cuts; damage will only be divided across the number of viable targets, not the total number of enemies.
  * You no longer have to run through Rose's entire dialogue if she's agreed to fight you.




	5. Inventory and stat rehaul

### Version 0.72

Lots of changes in this one.

So, it turns out I was doing save game updating completely wrong this whole time. Whoops! I have redone the code to hopefully work for future versions, and any past saves you load should hopefully be updated to the correct version now.

It is probably a better idea to just restart given how many changes needed to be made, but if you want to update an old save, there is one caveat: **if you have unlocked any style items from the superbosses, EQUIP THEM TO A PUPPET before updating** , as the save update will reset the inventory and remove them.

Other changes:

  * Standard deviation of stats doubled. The baseline is still 30, but stats now deviate from it in increments of 20 rather than 10. So for instance, Rogue now has a distribution of 10/30/50. I felt this was necessary with the increased damage constant; a 10-point difference just no longer matters anymore. Several enemies have had their stats adjusted as well. (Stat totals remain the same.)
  * Item economy has been rebalanced: You can now exchange items and customize your loadout before battles, but your total stock of items is much lower. By default, you now get only 1 of each status cure and stat booster, and no bombs at all. This was done because I observed the default loadout contained waaay too many items and made battles too easy.
  * Throwing Knife attack weight up to 1.4 (from 1.25); Grenade attack weight up to 1.6 (from 1.5).
  * Rose is slightly tweaked: Cooldown of Supernova increased to 4 turns; weight of Meteor Strike and Starlight Flurry reduced by 0.05; Crescendo weight increased by 0.1.
  * Fixed Mega Mabel's abilities; an improperly formatted string was preventing them from doing anything.
  * The defeated character is now removed correctly in the Big Dipper and Mega Mabel transition scenes.
  * Frenzy now works correctly, and is correctly flagged as a stat mod.
  * Fixed a text glitch in some of Cleric's abilities.
  * A message is now displayed if an effect fails to apply due to Stasis.




	6. Gravity Falls superboss

### Version 0.80

  * **NEW CONTENT!** Fight Bill Cipher, a nightmare demon who seeks to twist all of Gravity Falls to his will. He will bend reality itself around you, drowning you in ailments to confuse and entrap you.
  * Updated to engine version 1.06.2. The significant feature here is the ability to access the party menu through the [W] key. Please tell me if this results in any problems for you.
  * Fixed an error with Darwin using Protector.
  * Frenzy now has a power of 40 at default stats.
  * Assault weight up to 1.5 (previously 1.4).



Balancing Bill was pretty tricky, as his difficulty is more qualitative than quantitative. He is balanced assuming you have someone with ailment healing abilities (such as Witch or Mage), and I'm not sure how feasible it is to beat him without them. Please tell me of any issues you encounter.


	7. Adventure Time superboss

### Version 0.90

**NEW CONTENT!** Fight Marceline the Vampire Queen, Princess Bubblegum's terrifying ex-girlfriend! Half-demon, half-human, and all vampire, she's a highly unusual foe that will force you to think outside the box to overcome her menagerie of powers. To fight her, you will need to have beaten Princess Bubblegum already.

  * Updated to engine version 1.06.3.
  * Reduced the amount of Anti-Mineral Water available during the battle with Bill. You now get 3 if you have only one healer, 4 if you have none, and 2 otherwise.
  * Added links to the discussion pages on Archive of Our Own and Reddit in the story menu.
  * Reduced the size of the version update message, to reduce the chance of it spanning multiple lines.



Rogue is supposed to have their own solution to the Marceline battle, but my only concept for it was essentially a regular Twine game, and it turns out I'm no good at making those! I might return to it when I'm more experienced, but for now, there's no Rogue route.


	8. Final Battle live!

**NEW CONTENT!** The final challenge is here at last. After winning every other battle, investigate the gate in the lobby to fight four special opponents. Try fighting them multiple ways to see all their scenes!

Additional changes:

  * Updated to engine version 1.06.4. This fixes a few bugs.
  * A bug that incorrectly reset consumable items when reloading saves has been corrected.
  * Fixed a potential targeting glitch that could occur if an enemy tried to used a debuff attack when all puppets had ailment protection.



Thanks for playing! This game has been in development for over a year, and I'm really happy to see it finally come together.


	9. Post-Mortem

So I thought it's finally time to do a post-mortem on this! I think the game is pretty much finished at this point; I have a few more ideas I might add later, but everything I initially planned is in the game.

I'll be up-front about this: The entire reason I made the engine for this game is because I can't draw. I've tried other game-making programs, but even "accessible" ones like RPG Maker and Game Maker are extremely visual. Sure, they provide default graphics you can plug in, but everyone hates them and they make your game look like boring, generic garbage. You still have to think in visual terms, and you have to make unique sprites, facial expressions, animations etc. if you want your story to have any artistic subtletly or depth whatsoever. That doesn't exactly play to my strengths. Can you imagine the scenes in _Cartoon Battle_ if I had to do them in RPG Maker? It's not just the dialogue that made those scenes so enjoyable, it was the facial expressions, mannerisms, and behaviors of the characters that offered subtle storytelling through little tics and details. I love that stuff, and consider it vital for any good story, but I wouldn't have been able to do any of it in RPG Maker.

So if a picture is worth a thousand words, I'll just have to write ten thousand. Fortunately, a cerebral, turn-based game doesn't need visuals to make the gameplay work, so I made one in a fully text-based medium.

I think I succeeded. I unfortunately haven't gotten much feedback on the writing, but people seem to enjoy the gameplay despite the lack of multimedia. It was sometimes a little tricky coming up with unique descriptions for every single ability, but it was also a fun exercise to personalize the details that we so often skip over in RPGs. I love games like _UnderTale_ that use every aspect of their presentation to tell us about the world and characters, and I hope I was similarly able to express character details through attacks and fighting styles.

So, as for the game itself.

## First Principles

This was my first real game, as is probably obvious. I did not even try to filter myself; I crammed every idea I could think of into the game, and if it didn't work I hammered the engine until it did. This was pretty reckless, but I think it was a good idea for a game designed to stress-test a game-making engine. I don't want people to think they have to stick to the basic RPG formula; if they want to do really inventive stuff, I want to make sure that's possible! You want counterattacks? Here you go! You want different types of counterattacks that behave in very specific ways, like Blind Archer's Earshot from _Bonfire_? There it is! You want to do something crazy complex like Mia's Brand ability from _Prayer of the Faithless_? I got you! Getting them to work and integrating them cleanly with the rest of the engine was a trial, but in succeeding I showed how versatile the engine can really be, and I hope I inspired other designers to consider similar ideas.

When I laid out the core principles of the game, I did so by going through the many RPGs I've played over the years and identifying what I did and didn't like from them. I wanted to make the kind of game that I would enjoy playing. My major takeaways were:

**No randomization.**

I _despise_ random chance mechanics in video games, and they are especially prolific in RPGs. How much damage does your attack do? Oh, anywhere from 1 point to 12. Oh, but didn't we tell you? Sometimes you miss and your attack does nothing at all. Want to use one of your incredibly limited spell slots? Oh whoops, you flubbed your Spellcraft or Concentration check, you just lost a limited resource for nothing. Oh, but don't worry, it'll all balance out when you get a critical hit! Or don't.

I hate this. When you have so little idea of what your action will accomplish, tactical planning is nearly impossible. I can understand the argument of adding elements the player can't control to avoid creating a solved game, but stuff like the possibility of completely wasting an attack takes it way too far.

In _Cartoon Battle_ , attacks always hit and always do the same amount of damage; the only random factors are who the enemy hits and what ability they use, and even those can be influenced by some player actions. I think this is a much more reasonable way to avoid a solved game: the player can't predict what challenges they'll have to deal with, but they are always in complete control of their _own_ actions. This turns the game into more of a puzzle than a slot machine: if you figure out the tactically optimal response to an attack, you are consistently rewarded for your insight instead of potentially punished through no fault of your own. I prefer this style of play.

**Energy, not MP.**

Or in the terms I used in the engine's design doc, renewable resources, not limited resources. MP as a concept has often felt really awkward to me in RPGs; either the game affords you so few shots it effectively turns magic into a gimmick, or it gives you so many there is effectively no limit on your magic. ( _Final Fantasy X_ , anyone?) That's not tactically interesting. The point of limited resources is to engage with long-term _strategic_ planning, but modern computer RPGs have pretty much completely given up on that concept. I've always enjoyed renewable resource systems more, such as those in _Alter A.I.L.A. Genesis_ or _Wine & Roses_. When you have to actively generate the resources for your skills, you gain a greater appreciation for and understanding of them. The tradeoff between multiple resources, of time and HP for Energy, adds much more tactical depth. Furthermore, the renewable nature of the mechanic makes its failure states more interesting. If you run out of MP, you just can't use cool abilities anymore, which is boring; if you run out of Energy, you've put yourself at risk but you can still bounce back with clever maneuvering. Since _Cartoon Battle_ was purely tactical, with no long-term resource management, I figured this was a good fit.

**Everyone has special skills.**

Fighters are boring, okay? I understand that being able to take and deal big hits is an important contribution and all, but doing nothing but hitting "Attack" every round is still boring. Even in the more traditional editions of _Dungeons & Dragons_, fighters did actually have other abilities that forced you to make tactical trade-offs, such as Power Attack. So, none of that -- everyone gets special abilities, not just spellcasters.

**No speed stat or turn order.**

I have never, ever seen a good way to balance these. I genuinely do not think it is possible to properly balance a variable action economy in any RPG with qualitative abilities. More actions are always better than fewer actions, no matter how you try to balance for it. As for a constant action economy, and just using speed to determine turn order... I've never really seen the point of that. Speed becomes an either/or stat; you will always go after this character until you pass them, and then you will always go before that character no matter how many more points you stack on top. This tends to make Speed a really bad stat, since unlike other stats there is not a 1:1 ratio of investment to payoff. So I'm just not going to wade into this mess; you can control your characters in any order and enemies act all at once, done, simple, easy.

**No magic stats.**

I've always been a little dubious of making duplicate versions of stats that only apply in special circumstances. It whiffs of padding to me. There are other ways to accomplish the qualitative result of "You can do a lot of damage, but only sometimes" and "Some characters react differently to different types of attacks". I much prefer to keep things streamlined, especially for a simple proof-of-concept game like this, so I collapsed everything into one Attack and one Defense stat.

## Characters and Abilities

After estabilishing these guiding principles, I filled in most of the remaining details by copying ideas from _Bonfire_ , as it was one of the most enjoyable RPGs I've ever played. (Unfortunately, I've discovered it seems to no longer be available on MoaCube's website. The developers claim to be working on a new and improved version, but there have been no updates for years.) I took its character roster, player abilities, and the idea of the "Special" stat. (With one crucial change: I made Special defend against debuffs rather than Defense, to ensure it still mattered to characters with no debuff abilities. _Bonfire_ did have a bit of a problem with making it too easy for Knight and Blind Archer to ignore Special upgrades and just turn into overpowered killing machines.)

There are now 7 different puppets you can play with, but initially I only conceived of the basic three, to keep things simple. This influenced the design of the initial three in certain ways, because I thought I had to cram all my ideas into them. If I had the specialist classes in mind from the beginning, I might have streamlined the base classes a little more, maybe remove some of Mage's buff/debuff abilities, maybe give Fighter fewer defensive options... but I think it still turned out alright.

I didn't really care about consistency here; I didn't track how many abilities everyone had to ensure everyone had the same number. I believe everyone did end up with about the same number anyway, but that was happy coincidence.

I knew that I wanted to make the characters not just the archetypical _Dungeons & Dragons_ party, but to each revolve around one of my three stats: Attack, Defense, and Special. So Fighter had to have tanking and protection abilities, Mage had to have powerful attacks, and Rogue would have disabling debuff abilities, plus cool items to make use of their Special. (It amused me that under this setup, Rogue is actually the "wizard" in game-mechanical terms: their regular attacks are poor, but they can expend limited resources for very powerful one-off abilities.)

It's interesting to look back through my original design document. For the most part, it's very consistent with the final product.

  * My first note for Fighter says "No magical abilities, get creative with the many things mundane weapons can do". Very early on I considered giving Fighter more weapons, but decided three was enough. Two abilities of theirs that I cut were "Swing", an attack that hit all foes, and "Trickster", a stance that allowed them to counter-attack. (This was inspired by Assassin's "Riposte" ability from _Bonfire_.) I also vaguely considered giving them some sort of "Feint" attack, but couldn't figure out what it would actually do. (I think the idea was that it could bypass counterattack stances, but I didn't end up using those.) They also had an ability some alpha testers may recall: "Charge", which combined the functionality of both Assault and Bull Rush: a x1.5 attack that made them Off-Balance. More on why I changed this later.
  * I originally wanted to give Mage more status ailment spells and to break their "Blessing" spell into single buffs, but I decided they had too many abilities already. Two of their abilities I cut were Thaumastasis (which I would later bring back with Witch) and "Energy Purge", which would reduce an enemy's Energy points; this was before I decided I didn't want to use Energy for enemies. I already had the idea for their supercharged spells this far back, and with the exception of Annulment they did not change at all from original conception.
  * Rogue is the most different. My notes propose the idea of giving them magic items, but that never made it off the ground. Crossbow wasn't armor-piercing at this point; I changed that because Rogue's poor Attack just made it too crappy to ever be worth using otherwise. I cut three abilities from them: Hunter (which I later brought back with Archer), "Sucker Punch", which would inflict Dizzy (pointless when I decided I wouldn't make enemies affected by Dizzy)... and "Procure". The idea behind this one was that Rogue could spend Energy points to create an item out of thin air, adding it to party stock. I did implement it in the very first versions of the game, and the code is still in the engine if you check. I ultimately decided it was too hard to balance while also keeping items meaningfully powerful, so I went hard and made items completely limited.
  * Status effects remained the same from original conception. I struggled with the name for the DEF debuff for a little before settling on "Pain".
  * Items are also pretty much all the same. I struggled with coming up with a name for the Dizzy cure and considered a mass attack item that inflicted Dizzy, again before I decided I wouldn't use Dizzy on enemies. My working name for it was "Sonic Boom", which is different from the chaff grenade idea I settled on when I brought the item back for Anais.
  * Aw, and I have a little rant about how much I hate random targeting. I ended up going with it after all, though.



Once I got this all working, I came up with the specialist classes because I knew I wanted my engine to have a party swapping mechanic, and so my example game might as well show it off. I came up with Bard first as sort of a trial run, and then made the other three.

## Enemies

I actually came up with the enemies before the player characters. This is generally not how you should do it, but in this case it was the premise of the entire game, so.

What was important to me was that every battle had a unique feel to it. Every enemy demonstrated a different concept.

  * Princess Bubblegum and associates (I will never get tired of referring to the Mertens brothers that way) are a "[flunky boss](http://tvtropes.org/Main/FlunkyBoss)". There is a power discrepancy between Bubblegum and the others; she is the main threat, but you have weaker minions nipping at your heels the whole time. In this case, the flunkies are the boss' strength, as she weaponizes them through powerful buffs. Once you take them down, she's not all that tough on her own.
  * The Mystery Twins are a [dual boss](http://tvtropes.org/Main/DualBoss) that [turns red](http://tvtropes.org/Main/TurnsRed). The meaning of a "dual boss" is actually inverted here where the standard enemy size is 3; they are actually less of a handful than the other encounters. But the real Big Idea behind these guys is that they become stronger once you beat one of them, intensifying the battle for the final stretch. You get to pick your poison here; do you quickly take out the support caster but make the blaster more dangerous in the process, or do you try to blitz the heavy hitter and weather a more protracted fight against an empowered debilitator?
  * The Watterson kids' gimmick is unpredictability. Gumball's actions have a wide spectrum of usefulness, everything from stunning himself to a powerful AoE nuke, and Darwin has no preference for who he protects. Anais inverts this by being very predictable, but she's also the one you're most likely to take out first. Their surrender behavior is also, I expect, rather surprising, and not something you would know going in.
  * The Crystal Gems' gimmick is supposed to be that they're the hardest because they actually know how to fight, but I don't know how well I actually succeeded at that.
  * Marceline is a [puzzle boss](http://tvtropes.org/Main/PuzzleBoss).
  * Bill is a [gradual grinder](http://tvtropes.org/Main/GradualGrinder) \-- little in the way of direct damage, but an absolute nuisance of status effects.
  * Nicole is a [rush boss](http://tvtropes.org/Main/RushBoss). I originally considered giving her the counterattack stance, since that would fit with her martial artist aesthetic, but decided a defensive ability didn't fit the rest of her.
  * Rose is a [marathon boss](http://tvtropes.org/Main/MarathonBoss) and a [sequential boss](http://tvtropes.org/Main/SequentialBoss).
  * The final boss is a [mirror match](http://tvtropes.org/Main/MirrorMatch) and a [wolf pack boss](http://tvtropes.org/Main/WolfpackBoss), even moreso than the tier 1 fights.



I'm very pleased with how well I was able to follow through with these varied concepts while still remaining true to the characters!

## The Damage Formula

In addition to everything else I took from _Bonfire_ , I also took its damage formula... with a few tweaks. I altered it from lumped weighting to specific weighting. If you don't know those terms off the top of your head, it's the difference between this:

DMG = (Attack - Defense) * [unique ability weight]

and this:

DMG = Attack * [weight] - Defense

Hoo boy did I end up regretting that decision.

My reasoning was this: This makes more intuitive sense with how we think of strong attacks in the real world. If you punch something harder, you can break through strong defenses. This also has the added benefit of making attacks that hit multiple times meaningfully different than strong single attacks: the Defense term remains constant in both cases, so multiple-hit attacks will see a greater dependence on Defense. I wanted to use this functionality for Rogue's attacks, so it seemed like a good idea.

I ran into problems almost immediately. Because you see, you can't use a formula that's literally just Attack minus Defense if you want to have Attack and Defense exist on the same scale, because if Attack and Defense are equal, the attack does no damage. The way _Bonfire_ dealt with the problem was to add a constant, like so:

DMG = [20 + (Attack - Defense)] * [weight]

This is fine if you use lumped weighting. It gets weird when you use specific weighting.

To begin with, my game had much higher HP values, so I doubled the constant. However, I, perhaps foolishly, kept stat values relatively low in comparison ("manageable", I told myself). The average stat value was 30, and at this time, Rogue had an Attack of 20. So the average damage from their Knife attack was this:

DMG = [40 + 20 * W - 30] x 2

Notice how the constant is double that of the Attack stat. And since it was a multi-hit attack, to make it on par with a normal attack I'd have to give it a low weight, reducing the value of Attack even further! Even when I dropped the weight to incredibly low values (I think I went as low as 0.1 at one point), Knife was still beating out Sword thanks to that massive constant getting applied twice.

What I hadn't predicted, and what I now knew, was that multi-hit attacks experienced great dependence on the base constant, not just the difference between Attack and Defense as I intended. The large base constant I used skewed the results.

I kludged a fix for this by applying the weight term over the sum of the base and the Attack stat, like so:

DMG = (40 + ATK) * W - DEF

And this worked. By making the weight apply to the total base damage, I could control for the influence of the base constant, and effectively balance multi-hit attacks.

...But this led to its own problem: Disproportionately favoring _high_ -weight attacks. Because now a high weight multiplies not just your Attack, but also the base constant. Now it's _single_ -hit attacks that can be disproportionately skewed by the base.

This one I... never really fixed. You may notice that Mage and Archer's ultimate abilities can rack up some pretty ridiculous damage values. I overall decided this wasn't too bad of a glitch, since reducing the effect of Defense with strong attacks is the entire point of this weighting system in the first place; but I do worried it skewed things a little too much, especially after I boosted the base constant further. I think I could have patched it by only making weight apply to the base for multi-hit attacks, but that strikes me as an inelegant solution.

Ultimately, I wasn't even able to totally balance multi-hit attacks. On the itch.io page, you can see me complaining a while back that Archer's 10-point Shot is impossible to balance with the rest of the system because it multiplies any Defense difference by an absolutely unmanageable amount.

My takeaway advice for you is that if you choose to use multi-hit attacks in this style, **don't** use a base constant, use something like RPG Maker's _a.atk * 2 - b.def_ or just bite the bullet and make all Defense stats lower than Attack. Also, don't ever make a multi-hit attack that hits 10 times. @_@

## Balancing the Numbers

So at this point I had all the core parts of an RPG. I had my characters, I had their abilities, and I had my damage formula. Now I just had to fill in the numbers.

This is an important question in RPGs. What scale do you want to work with? Do you want even a 1-point difference to be meaningful, or do you want to dazzle the player with incomprehensible numbers? I generally prefer the former, so I leaned towards that in my design. Stats were double-digits, with relatively small variations between them. I picked 30 as a baseline rather arbitrarily; I think my reasoning was something along the lines of "I have 3 stats, and 10 is a nice multiple." It seemed obvious to give every character the same stat total (90) for ideal balance, and then adjust the distribution to create specialties. In the first version of the game, I only had Fighter, Rogue, and Mage, which each mapped perfectly onto one of the three stats: Defense for Fighter, Special for Rogue, and Attack for Mage. I decided that each of them would have one focus stat that was 10 points above baseline, one dump stat that was 10 points below baseline, and one regular stat that remained at baseline. There would be no redundancies; no two puppers could have the same focus stat _or_ dump stat.

From there, the distribution was pretty easy. Fighter, the tank: 30 ATK / 40 DEF / 20 SPC. Mage, the glass cannon: 40 ATK / 20 DEF / 30 SPC. Rogue took a little more thought, but by process of elimination the only remaining layout was 20 ATK / 30 DEF / 40 SPC.

Enemies got the same stat totals, because the fights were 3-on-3. How did I decide on a total of 150 for the boss enemies? I'll be honest, it was entirely because I designed Nicole first and that was what worked for her. I knew exactly what I wanted her stat distribution to be: triple-digit Attack, average Defense, and poor Special; that translated to 100 / 30 / 20.

That looked pretty good. But how much HP? Like the stats, I wanted to give everyone the same amount, and I also wanted it to be an even number because I like things being neat. Why did I settle on something as high as 1000? Because I decided early on I would do something completely bonkers:

No healing.

I gotta be honest with you, I hate what healing has become in most modern RPGs. Because you _can_ heal every turn (our old friend MP strikes again), designers assume you _will_ , and therefore you _must_. I am so sick of battles where the healer can never do anything but spam the mass heal spell every turn because the enemy attacks are so powerful that the party is toast if they skip even once. That's not using the characters to their fullest tactical potential! It's not interesting!

So no healing. It's just another thing I gotta balance for and other thing I'd have to cram into ability lists that are I'm already worrying are too long.

I actually think this worked out really, really well. _Cartoon Battle_ is so heavy on status ailments that you still have that sense of defensive team management without having to do it constantly. And for opponents that don't use a lot of status ailments, like Nicole, you're allowed to just go all-out on offense, which I think is more fun.

This also made it easier to balance enemies, which was something I was worried about. In most RPGs, there is an extreme health/damage asymmetry between players and enemies, since players can heal but enemies can't. By leveling that particular playing field, I can just give absolutely everyone the same HP and call it a day. This is, in fact, what I did originally: even the tier 1 opponents had HP totals of 3000. I would change this later.

## Now, to Actually Do It

I started out as a total Twine newbie. I had dabbled in C++ and Java coding before, so I understood the basics of programming, but not any of the specifics of Twine.

I quickly settled on SugarCube as the best format to use, and gave myself a crash course in CSS to create a working user interface. (This was easily the hardest and most time-consuming part of the project.) I sketched what I wanted the user interface to look like, and was able to translate it to the page with mimimal issue.

When I first started, I didn't know anything about Tweego, so I tried to do everything in Twine itself. This proved a terrible mistake and I have no idea why anyone uses the default Twine interface. I couldn't search for anything effectively, my passages were scattered all over the place, and I kept freezing up the program by flipping between so many passages at once.

My original model used a separate passage for every single phase of battle. Clicking ACT took you to the action list passage, clicking an action took you to the targeting phase passage, then to the confirm phase passage, and then to the action phase passage. I used the `include` macro to maintain a consistent appearance throughout, but the player still had to wait for the passage transition between every click, which was terrible. I eventually got so fed up with this even in my own playtesting that I changed it to its current model of modifying components of a single passage.

Originally I didn't even use _JavaScript_. My "action database" was a massive switch statement embedded in the action phase passage. And a massive switch statement embedded in the action list passage. And a massive switch statement embedded in the preview passage. It was a very bad decision.

Once I implemented actions, puppets, and enemies as JavaScript classes, and after I switched compilers to Tweego, everything went a lot smoother and I was finally able to make a public release.

So I have one lesson to teach from this, it's **don't use Twine's default interface for anything, ever.** Write everything in your code editor and compile it with Tweego.

## Status Effects

Hah. Hah. Hah.

My first attempt at this was _bad_. _Really_ bad. I just kept adding blocks to the Jenga tower and cramming stopgaps into every problem without ever standing back and admitting, "Okay, this isn't working."

I started with some _really_ complicated logic for applying status effects. Because it was necessary! What if a status effect was already applied, I don't want you to be able to stack them endlessly! But wait, some effects I did want to stack, so we need a handler for that. Now what if it's a debuff with a numerical component, how and when will that be calculated? What if we want to combine those? What if there's resistance or a protection effect, that bypasses all the normal rules to block the effect, but it shouldn't block buffs, and maybe it shouldn't block self-inflicted ailments either, and what if I _do_ want to make it block buffs, what if what if what if...

This was not even the worst part. That is why it is still in the engine, even though it's a clunky widget that's not very adaptable if you want status effects to work any differently than in _Cartoon Battle_ and probably would have been better off as a JavaScript function.

Oh no. See, once we finished all that and applied the effect, we had to tell it what to do. Originally, before I made effects into JavaScript objects, I think I actually made this part of the adder function as well. After the application check code, I had to manually stuff sub-functions into every single branch for every single effect, flipping flags and conveying stat changes, etc.

But wait! I said. How does the game know to undo those when we _remove_ the effect?

I tried a bunch of different things that for reasons I can't remember didn't work. In my infinite wisdom, the "solution" I settled on was an "effect manager" function that ran over every single character's effects and applied the appropriate changes.

In every.

Single.

Passage.

Shockingly, this caused problems! So, so many problems. But I was somehow convinced that manually recalculating the stat changes from every buff and debuff on the field in every single passage was the only way this could possibly work. (I think it had something to do with the possibility of stat modifiers changing power between application and removal, thus causing a disjunct in the removal function... I turned stat mods into such an unnecessary nightmare for myself.)

It wasn't until I started designing equipment and giving them functions to apply and remove their effects only on, y'know, application and removal that I said _Hey, wait a minute..._ and did the exact same thing for status effects.

So now all the code is in one nice JavaScript file and is only called when it needs to be, and the effect manager gets to be buried in a pit of shame forever.

## The Problems

Once I had a working prototype, my beta testers gave me very consistent feedback: Battles took too long, battles were too hard, and the system badly needed hotkeys.

The first one was an easy fix: double the damage formula's base again. The ultimate success of this was... mixed. I think battles do now progress at a good pace, but it wrecked the stat balance I initially designed. Stats now provided miniscule adjustments relative to the base value, so minor stat changes were now irrelevant. The 10-point standard deviation that worked well with a base of 40 was now pretty meaningless. I had to double the standard deviation, putting the puppets at their current stat values: 50 focus / 30 mid / 10 dump. This still wasn't a perfect fix, because stats couldn't be debuffed below 0, putting an upper limit on the effectiveness of debuffs for characters with low stats. I could and probably should have bumped up the stat totals. Why didn't I? I'll be honest, it's simply because I didn't want to ruin Nicole's perfect stat layout. With higher stat averages, triple-digit Attack would no longer be so jaw-dropping.

So lesson one: **High stat totals are easier to balance around.** Bigger stat values make each individual point less significant, but that also means you have more of a buffer if things prove difficult to balance, or if you need to adjust another part of the system. If I had started with higher stat totals, increasing the damage constant wouldn't have caused as many cascade effects.

The second one was also an easy fix: decrease the HP of the tier 1 opponents. With no healing, placing them on even footing with the player actually made them very dangerous; if the player didn't know what they were doing (because, you know, this was their first fight), they could make mistakes it was hard or impossible to recover from. So I dropped enemy HP totals from 3000 to 2000. This actually worked out fantastically. I was initially worried that it wouldn't split nicely three ways, but the Mystery Twins were only had to split it two ways; Princess Bubblegum had an uneven distribution anyway; and bumping up the individual values to 700 was fine for the Crystal Gems, since it subtly allowed me to make them a little harder. That only left the Watterson kids, for whom HP totals of 666 were actually perfectly fitting.

So lesson two: **Have a difficulty curve.** I put the very first fights in the game on even footing with the player, thinking that was fair -- but it wasn't, because while the enemies knew the rules of battle, the player didn't! Give the player breathing room to recover from mistakes. That often means giving them more HP than the enemy, and this counts double in a system where they can't recover it.

Hotkeys were just another thing I had to learn. Once I understood how they worked, implementation was easy. Chapel's event macros were a big help.

Once I did all that, I got more detailed feedback: Items were too awesome, and had to be nerfed in some way. In my original conception, items cost no Energy to use, copying the model of _Alter A.I.L.A. Genesis_ \-- but in practice, this tended to mean Rogue and Fighter ended up overflowing with Energy as they pumped Stimulants into Mage. This was an easy fix: I just made items cost 2 Energy, the same as basic attacks, and halved that for Rogue and Witch to cement their role as item wizards.

But that still wasn't good enough. Items were still too powerful, and you just got too many of them. But I couldn't reduce the player's stock any further -- I already only gave the player 1 of each attack item! But I had just designed _so many_ attack items that the total firepower added up to too much. To solve this problem, I designed the item shop. Yes, that was actually a very late addition! But I figured I ought to design one anyway, since shops are a staple of RPGs. I took a hard line on this, severely reducing the player's total stock and giving them no bomb items at all by default. Rogue could now be a supporter _or_ a damager, but not both. I think the end result is pretty well-balanced.

I was also informed that no one saw any reason to ever use Charge, because making the tank so vulnerable always seemed like a terrible idea. So I split the functionality into two new abilities, Bull Rush and Assault. Now, if you're making Fighter Off-Balance, you're at least making the enemy Off-Balance at the same time; and Winded is a less debilitating effect than Knocked Down, so a less extreme price to pay for extra damage. (It also does a better job of advertising "This is an attack to use when you have Energy to burn", which was the idea behind Charge in the first place.)

## Balancing the Bosses

Balancing the tier 2 enemies gave me some trouble. I didn't want to give them multiple attacks, yet I still had to not only balance the inherent inequality of a 3-on-1 fight but make them _more_ challenging than the previous 3-on-3s.

Nicole was easy, because she was just a numbers game. I just kept pumping up the weights on her attacks until she stood a chance of winning the damage race.

Rose was trickier. Because the entire point of her was that the battle dragged out for a long time, damage-over-time effects, which I had already made very powerful, ended up trivializing her. If you used Perdition at the start of the fight (and why wouldn't you?), it added up to something like 500 extra damage by the end, which was huge. To balance this, I gave her tolerances to damage-over-time effects, and also implemented a rule that halved Perdition's damage against bosses. This was fair, I thought, since you only have to cast it once instead of thrice.

Bill proved the most difficult. Because his gimmick, status effects, was qualitative rather than quantitative, I couldn't just fudge the numbers like I could for Nicole and Rose. Originally, his sleep spell _only_ inflicted sleep, and only hit one person. Because it didn't do damage, and because Witch could cure a single status ailment indefinitely, that was effectively a wasted turn -- and he was already only getting 1 turn to your 3. Not good. I actually did crack and gave him two actions per round for a little while, but then he became _too_ hard, because his few damaging skills _were_ balanced assuming 1 action per round. When he could stick Burning on everyone _and_ put someone to sleep in the same round, it became impossible to keep up with him. In the end, my solution was actually quite simple: Just stack another status effect on top of his sleep spell. Now Witch couldn't completely negate him every turn, problem solved. I also gave him an ability that sleeps two characters at once, which is quite a bit harder to recover from.

Marceline, to my surprise, was actually smooth sailing. I had to implement a few new mechanics for her (respawning, immortal enemies, passage jump actions, and delayed attacks), but they all went off without a hitch.

## Conclusion

I believe _Cartoon Battle_ was a smashing success overall. It had a rough start, but once I figured out how to ditch the awful Twine interface and do everything in Notepad++, I pumped out content pretty fast and ended up with an RPG engine that has nearly every function you could want for building an RPG. I tried a lot of things and threw a lot of complicated moving parts together, and the end result actually works. I definitely could have balanced the numbers better, and I will probably be using different damage formulas and stat layouts in future games, but it isn't bad for a first try.

I think I'll take a bit of a break from game design now that I've achieved this milestone, but there are still refinements I can make to the engine. In particular, I think I will want to take a closer look at the leveling mechanics, since I didn't implement that here and thus haven't actually tested it. The current engine works well for this style of a few distinct set piece battles, but it remains to be seen how robust it is for a real RPG.

I think I will also need to - _shudder_ \- redesign the battle UI. The way I render the status boxes and the command boxes as completely separate elements breaks the display at party sizes larger than 3, which is a limitation I didn't intend. I'll try looking into ways to make multiple rows of characters possible.

I hope I conveyed my ideas on game design well, and I hope you enjoyed.

(And as always, don't be afraid to comment on the story scenes as well! I had so much fun writing them and I'd love to know if you had as much fun reading them.)


	10. Version 2.00 and Source Code

Been a while, huh? I decided to finally bite the bullet and update the game to engine version 1.15.1. This is a BIG change and required restructuring huge swaths of code. I believe the save updater should preserve your existing saves correctly, but tell me if you encounter any issues. While most of the changes are to the backend, you will get to enjoy the new and improved user interface for battles, custom save displays, and a slightly nicer-looking party menu.

While I was there, I also fixed the choice lists. They should now be correctly formatted as blockquotes.

Additionally, I have released the source code for viewing, if you want to know how any specific details or passages were done. Enjoy!

**Author's Note:**

> Feel free to discuss anything and everything about the game in the comments! This is my first game, so I need a lot of feedback to tell what worked and what didn't.
> 
> You're also welcome to talk about the story (such as it is). It was very important to me to stay as true to the characters as possible, and give them battling styles that reflected their personalities. Do tell me what you thought of their scenes, and if there are any interaction options you'd like me to add!


End file.
